package com.example.exceldemo.service.impl;

import cn.afterturn.easypoi.entity.ImageEntity;
import com.example.exceldemo.config.WordUtil;
import com.example.exceldemo.entity.UserPoi;
import com.example.exceldemo.enuns.FileType;
import com.example.exceldemo.exception.ServiceException;
import com.example.exceldemo.service.WordService;
import com.example.exceldemo.utils.FileUtils;
import com.example.exceldemo.utils.PoiUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description
 * @Author xiaohuang
 * @Date 2024/7/10
 */
@Slf4j
@Service
public class WordServiceImpl implements WordService {
    @Autowired
    private WordUtil wordUtil;
    @Override
    public void exportTemplate() {
        String realImagePath="E:/data/file/faceimg/tmp/1.jpg";
        //存放单个数据
        HashMap<String, Object> mapHead = new HashMap<>();
        mapHead.put("tile", "深圳程序猿相亲记");
        mapHead.put("age", "23");
        mapHead.put("name", "隔壁小王");
        //创建了一个名为simage的新的ImageEntity对象，并将其赋值给simage变量。
        // 具体来说，ImageEntity是一个Java类，用于表示一个图像实体，其中包含了图像的各种属性和数据。
        ImageEntity simage = new ImageEntity();
        simage.setHeight(80);
        simage.setWidth(80);
        //将图片的本地路径导入进去
//        simage.setUrl(realImagePath);
//        simage.setType(ImageEntity.URL);
        //将simage对象的类型设置为byte[]类型。
        simage.setType(ImageEntity.Data);
        simage.setData(FileUtils.getByte(realImagePath)); //字节流读取
        //将图片添加进去
        mapHead.put("image", simage);
        List<Map<String, Object>> alarms = new ArrayList<>();
        //存放表头
        Map<String, Object> alarm=new HashMap<>();
        for (int i = 0; i <10 ; i++) {
            alarm.put("order","男嘉宾"+i+"号");
            alarm.put("name","小鱼"+i);
            alarm.put("age",18+i);
            alarm.put("image",simage);
            alarm.put("optimal","能吃");
            alarms.add(alarm);
        }
        mapHead.put("alarms", alarms);
        try {
            wordUtil.exportWord("template/word/jxxj.docx", "深圳相亲记", mapHead, FileType.DOCX,"jxxj.docx");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 初始化Docx文档，包括标题、章节和示例内容的创建
     */
    @Override
    public void docxInit() {
        // 创建一个新的XWPFDocument对象，用于编写.docx文件
        XWPFDocument doc = new XWPFDocument();

        // 创建文档标题
        PoiUtils.createTitle(doc, "Java 全栈知识体系");

        // 创建第一章标题
        PoiUtils.createChapterH1(doc, "1. 知识准备");
        // 创建第一章节小标题
        PoiUtils.createChapterH2(doc, "1.1 什么是POI");
        // 创建第一章节内容段落
        PoiUtils.createParagraph(doc, "  Apache POI 是创建和维护操作各种符合Office Open XML（OOXML）标准和微软的OLE 2复合文档格式（OLE2）的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。更多请参考[官方文档](https://poi.apache.org/index.html)");
        // 创建第一章节小标题
        PoiUtils.createChapterH2(doc, "1.2 POI中基础概念");
        // 创建第一章节内容段落
        PoiUtils.createParagraph(doc, "  生成xls和xlsx有什么区别？POI对Excel中的对象的封装对应关系？");

        // 创建第二章标题
        PoiUtils.createChapterH1(doc, "2. 实现案例");
        // 创建第二章节小标题
        PoiUtils.createChapterH2(doc, "2.1 用户列表示例");
        // 创建第二章节内容段落
        PoiUtils.createParagraph(doc, "  以导出用户列表为例");

        // 表格数据准备
        List<UserPoi> userList = getUserList();
        // 创建一个段落用于容纳表格
        XWPFParagraph paragraph = doc.createParagraph();
        // 创建一个表格，行数和列数根据用户列表大小确定
        XWPFTable table = paragraph.getDocument().createTable(userList.size(), 6);
//        // 设置表格宽度
//        table.setWidth(520);
//        // 设置表格的单元格间距
//        table.setCellMargins(20, 20, 20, 20);
        //设置表格内容自动换行
        table.setTableAlignment(TableRowAlign.CENTER);//表格居中
        CTTblPr tblPr = table.getCTTbl().getTblPr();
        tblPr.getTblW().setType(STTblWidth.DXA);// 表格固定宽度
        tblPr.getTblW().setW(BigInteger.valueOf(14000L));//表格总宽度
        CTTblLayoutType layoutType = table.getCTTbl().getTblPr().addNewTblLayout();
        layoutType.setType(STTblLayoutType.FIXED);//FIXED：列固定宽度 AUTOFIT：列自动宽度


        for(int i = 0; i< userList.size(); i++) {
            List<XWPFTableCell> tableCells = table.getRow(i).getTableCells();

            if (i == 0){
                tableCells.get(0).setText("序号");
                tableCells.get(1).setText("用户名");
                tableCells.get(2).setText("邮箱");
                tableCells.get(3).setText("手机号");
                tableCells.get(4).setText("描述");
                tableCells.get(5).setText("图片");
                XWPFTableCell cell = table.getRow(i).getCell(3);

            }else {
                tableCells.get(0).setText(userList.get(i).getId()+"");
                tableCells.get(1).setText(userList.get(i).getUserName());
                tableCells.get(2).setText(userList.get(i).getEmail());
                tableCells.get(3).setText(userList.get(i).getPhoneNumber()+"");
                tableCells.get(4).setText(userList.get(i).getDescription());
                tableCells.get(5).setText("");
                //表格插入图片
                XWPFTableRow row = table.getRow(i);
                XWPFTableCell cell = row.getCell(5);
                XWPFTableCell descCell = row.getCell(4);

                XWPFParagraph cellParagraph = cell.addParagraph();
                // 图片输入流
                InputStream inputStream = FileUtils.getInputStream(userList.get(i).getPhoto(), null);
                XWPFRun run = cellParagraph.createRun();
                // 添加图片到文档中
                try {
                    run.addPicture(inputStream, Document.PICTURE_TYPE_PNG, "Generated", Units.toEMU(50), Units.toEMU(50));
                    run.addBreak();
                } catch (InvalidFormatException e) {
                    throw new RuntimeException(e);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            setTableColumnWidthPercentage(table, 6, 100, 1400,i);





        }

        // 创建第四章节小标题
        PoiUtils.createChapterH2(doc, "2.2 图片导出示例");
        // 创建第四章节内容段落
        PoiUtils.createParagraph(doc, "以导出图片为例");
        // 图片导出操作
        try {
            XWPFParagraph paragraph2 = doc.createParagraph();
            // 图片输入流
            InputStream inputStream = FileUtils.getInputStream("image/3.jpg", null);
            XWPFRun run = paragraph2.createRun();
            // 添加图片到文档中
            run.addPicture(inputStream, Document.PICTURE_TYPE_PNG, "Generated", Units.toEMU(100), Units.toEMU(100));
            FileUtils.exportXwpfDocument(doc, "poi自定义导出docx", FileType.DOCX);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            throw new ServiceException(e.getMessage());
        }
    }

    /**
     * 设置列宽度(比例)
     *
     * @param table           表格
     * @param columnIndex     列索引
     * @param percentage      列宽度的百分比
     * @param totalTableWidth 表格总宽度
     */
    private void setTableColumnWidthPercentage(XWPFTable table, int listSize, int percentage, int totalTableWidth,int i) {
        for (int j = 0; j <listSize ; j++) {
            int columnWidth = Math.round(totalTableWidth * percentage / 100.0f);
            XWPFTableCell cell = table.getRow(i).getCell(j);
            CTTcPr tcPr = cell.getCTTc().isSetTcPr() ? cell.getCTTc().getTcPr() : cell.getCTTc().addNewTcPr();
            CTTblWidth cellWidth = tcPr.isSetTcW() ? tcPr.getTcW() : tcPr.addNewTcW();
            cellWidth.setW(BigInteger.valueOf(columnWidth));
            cellWidth.setType(STTblWidth.DXA);
            setTableCellWidthTwips(table.getRow(i).getCell(j), columnWidth);
        }

    }

    private void setTableCellWidthTwips(XWPFTableCell cell, int columnWidth) {
        cell.getCTTc().getTcPr().getTcW().setW(BigInteger.valueOf(columnWidth));
        cell.getCTTc().getTcPr().getTcW().setType(STTblWidth.DXA);

    }

    private List<UserPoi> getUserList() {
        List<UserPoi> userList = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            UserPoi poi = new UserPoi();
            poi.setId(Long.valueOf(i+1));
            poi.setUserName("小明"+i);
            poi.setEmail("123456"+i+"@qq.com");
            poi.setPhoneNumber("123456789"+i);
            poi.setDescription("2333354444444455555555454543332323232"+i);
            poi.setPhoto("image/3.jpg");
            userList.add(poi);
        }
        return userList;
    }

}
